package com.rabbit.springrabbitmq.config;

import com.rabbit.springrabbitmq.adapter.MessageDelegate;
import com.rabbit.springrabbitmq.message.TextMessageConverter;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.amqp.support.ConsumerTagStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.UUID;

/**
 * @Author: JohnCoding
 * @Description:
 * @date: 2020/8/5 22:27
 */
//@Configuration
//@ComponentScan({"com.rabbit.springrabbitmq.*"})
//public class RabbitMQConfg {
//
//    @Bean
//    public ConnectionFactory connectionFactory() {
//        CachingConnectionFactory factory = new CachingConnectionFactory();
//        factory.setAddresses("127.0.0.1:567");
//        factory.setUsername("guest");
//        factory.setPassword("guest");
//        factory.setVirtualHost("/");
//        return factory;
//    }
//
//
//    @Bean
//    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
//        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
//        rabbitAdmin.setAutoStartup(true);
//        return rabbitAdmin;
//    }
//
//    @Bean
//    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
//        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//        return rabbitTemplate;
//    }
//
//
//    @Bean
//    public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory) {
//        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
//        //设置监听队列
//        container.addQueues(queue001(), queue002(), queue003());
//        //设置消费者数量
//        container.setConcurrentConsumers(1);
//        //设置最大消费者数量
//        container.setMaxConcurrentConsumers(5);
//        //设置重回队列
//        container.setDefaultRequeueRejected(false);
//        //设置签收机制  自动签收
//        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
//        //设置消费者标签策略   自己生成的标签策略  按照自己想要的格式生成，Envelope(回调的这个参数的设置)
//        container.setConsumerTagStrategy(new ConsumerTagStrategy() {
//            @Override
//            public String createConsumerTag(String queue) {
//                return queue + "_" + UUID.randomUUID();
//            }
//        });
//        //设置消息监听者    消息来了会走到onMessage 方法
////        container.setMessageListener(new ChannelAwareMessageListener() {
////            @Override
////            public void onMessage(Message message, Channel channel) throws Exception {
////                //消息处理
////                String msg = new String(message.getBody());
////                System.out.println("消费者收到消息"+msg);
////            }
////        });
//
//        //1.适配器的使用方法1
//        //自主配置消息监听适配器，可以自主实现监听者类（不需要实现ChannelAwareMessageListener的onMessage方法），该类帮助我们来设配成监听器
//        /*MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
//        //可以自主修改监听的方法名称
//        adapter.setDefaultListenerMethod("dddd");
//        //可以自主设置接收数据转换类型
//        adapter.setMessageConverter(new TextMessageConverter());
//
//        container.setMessageListener(adapter);*/
//
//
//        //2.适配器的使用方法2
//        MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageDelegate());
//        HashMap<String, String> map = new HashMap<>();
//        //key为队列名称， value为监听器的方法名称 ， 这样就可以把队列和方法区分开来，对不同队列进行不同方法的处理
//        map.put("queue.001","method1");
//        map.put("queue.002","method2");
//        adapter.setQueueOrTagToMethodName(map);
//        container.setMessageListener(adapter);
//
//        return container;
//    }
//
//    @Bean
//    public TopicExchange exchange001() {
//        return new TopicExchange("spring.test.001", true, false);
//    }
//
//    @Bean
//    public TopicExchange exchange002() {
//        return new TopicExchange("spring.test.002", true, false);
//    }
//
//    @Bean
//    public Queue queue001() {
//        return new Queue("queue.001", true);
//    }
//
//    @Bean
//    public Queue queue002() {
//        return new Queue("queue.002", true);
//    }
//
//    @Bean
//    public Queue queue003() {
//        return new Queue("queue.003", true);
//    }
//
//
//    @Bean
//    public Binding binding001() {
//        return BindingBuilder.bind(queue001()).to(exchange001()).with("spring.*");
//    }
//
//    @Bean
//    public Binding binding002() {
//        return BindingBuilder.bind(queue002()).to(exchange001()).with("rabbit.*");
//    }
//
//    @Bean
//    public Binding binding003() {
//        return BindingBuilder.bind(queue003()).to(exchange002()).with("mq.*");
//    }
//
//}
